#include "shm.hpp"
#include "Fifo.hpp"

// // 建立通信信道
// int main()
// {
//     Shm shm;
//     // 获取共享内存
//     shm.Get();
//     sleep(3);
//     // 映射到自己的地址空间
//     shm.Attach();
//     // 打印出来, server端和client端的虚拟地址不同
//     shm.VirtualAddr();
//     sleep(3);

//     return 0;
// }

// // 进程间通信
// int main()
// {
//     Shm shm(pathname, projid, USER);
//     char *mem = (char*)shm.VirtualAddr();
//     // 写入操作，每隔一秒向虚拟地址写入字母(从A开始)
//     int index = 0;
//     for (char c = 'A'; c <= 'Z'; index += 2)
//     {
//         // 成对的写入, 但server端读取的时候不会按照我们预期的读取成对了的(无保护机制)
//         mem[index] = c;
//         sleep(1);
//         mem[index + 1] = c;
//         sleep(1);
//     }

//     return 0;
// }

// 要想弥补无同步机制的缺陷, 我们可以使用管道
int main()
{
    // 文件操作
    FileOper writerfile(PATH, FILENAME);
    writerfile.OpenForWrite();


    Shm shm(pathname, projid, USER);
    char *mem = (char*)shm.VirtualAddr();
    // 写入操作，每隔一秒向虚拟地址写入字母(从A开始)
    int index = 0;
    for (char c = 'A'; c <= 'C'; index += 2)
    {
        // 向共享内存写入
        sleep(1);
        mem[index] = c;
        mem[index + 1] = c;
        c++;
        sleep(1);
        mem[index + 2] = 0; // 用来保证每次写进去的是字符串
        writerfile.Wakeup(); // 唤醒管道, 示意共享内存可以读取了
    }

    writerfile.Close();
    return 0;
}
